package com.bird.file.bytestream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author sijunqiang
 * @data 2021/7/31 15:08
 * @description: 文件输出流，用于将数据写出到文件.
 */
public class FileOutputStream {


    // public FileOutputStream(File file); 创建文件输出流 以写入由指定的File对象表示的文件.
    // public FileOutputStream(String name); 创建文件输出流 以指定的名称写入文件
    //note: 当你创建一个流对象时，必须传入一个文件路径。该路径下，如果没有这个文件，会创建该文件。如果有这个文件，会清空这个文件的数据


    // 创建文件输出流
    public static void main1(String[] args) throws FileNotFoundException {
        // 使用file对象 创建流对象
        File f = new File("a.json");
        java.io.FileOutputStream fos = new java.io.FileOutputStream(f);

        // 使用文件名创建文件输出流
        java.io.FileOutputStream fos1 = new java.io.FileOutputStream("b.txt");
    }

    //写出字节数据-单个
    public static void main2(String[] args) throws IOException {

        // 使用文件名称 创建文件流对象
        java.io.FileOutputStream fos = new java.io.FileOutputStream("fos.txt");

        //写出数据
        fos.write(97);
        fos.write(98);
        fos.write(99);

        // 关闭流资源
        fos.close();
    }

    // 写出字节数组-数组
    public static void main3(String[] args) throws IOException {

        // 使用文件名称创建流对象
        java.io.FileOutputStream fos = new java.io.FileOutputStream("fow.txt");
        // 将字符串转换字节数组
        String str = "奋斗的小鸟";
        byte[] bytes = str.getBytes();
        //写出字节数组
        fos.write(bytes);
        // 关闭资源
        fos.close();
    }

    // 写出指定长度的字节数组
    public static void main4(String[] args) throws IOException {
        // 使用文件名称创建流对象
        java.io.FileOutputStream fos = new java.io.FileOutputStream("fow.txt");

        // 字符串转换字节数组
        String str = "abcedfgh";
        byte[] bytes = str.getBytes();

        // 从bytes字节数组中写出数据 从第2个索引开始 写出三个 结果应该是 ced
        fos.write(bytes, 2, 3);

        //关闭流资源
        fos.close();
    }

    // 数据追加
    public static void main5(String[] args) throws IOException {

        //- public FileOutputStream(File file, boolean append)： 创建文件输出流以写入由指定的 File对象表示的文件。
        //- public FileOutputStream(String name, boolean append)： 创建文件输出流以指定的名称写入文件。
        //这两个构造方法，参数中都需要传入一个boolean类型的值，true 表示追加数据，false 表示清空原有数据。
        // 这样创建的输出流对象，就可以指定是否追加续写了，代码使用演示：
        //使用文件名追加
        java.io.FileOutputStream fos = new java.io.FileOutputStream("fow.txt", true);

        // 字符串转换字节数组
        String str = "abcd";
        byte[] bytes = str.getBytes();

        // 写出字节数组
        fos.write(bytes);

        //关闭流资源
        fos.close();
    }


    // 写出换行
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        java.io.FileOutputStream fos = new java.io.FileOutputStream("fow.txt", true);
        // 定义字节数组
        byte[] words = {97, 98, 99, 100, 101};
        // 遍历数组
        for (byte word : words) {
            fos.write(word);
            // 将换行符转换字节写出

            String str = System.lineSeparator(); // 获取换行字符串
           // fos.write("\r\n".getBytes());
             fos.write(str.getBytes());
        }
        // 关闭资源
        fos.close();
    }
}
